# -*- coding: utf-8 -*-
from config import epd_ind
"""
数据处理工具模块
"""

def byte_to_str(v):
    """
    将字节转换为字符串
    :param v: 字节值
    :return: 转换后的字符串
    """
    return chr((v & 0xf) + 97) + chr(((v >> 4) & 0xf) + 97)


def word_to_str(v):
    """
    将字转换为字符串
    :param v: 字值
    :return: 转换后的字符串
    """
    return byte_to_str(v & 0xff) + byte_to_str((v >> 8) & 0xff)


def prepare_data_strings_a(a, c):
    """
    准备数据并返回字符串数组（方法A）
    :param a: 像素数组
    :param c: 颜色模式：-1(16位模式)、-2(4位模式)或其他(比较模式)
    :return: 处理后的字符串数组
    """
    result = []
    px_ind = 0

    # 继续处理直到所有像素都被处理
    while px_ind < len(a):
        rq_msg = ""

        if c == -1:
            # 16位模式
            while px_ind < len(a) and len(rq_msg) < 1500:
                v = 0
                for i in range(0, 16, 2):
                    if px_ind < len(a):
                        v |= a[px_ind] << i
                    px_ind += 1
                rq_msg += word_to_str(v)
        elif c == -2:
            # 4位模式
            while px_ind < len(a) and len(rq_msg) < 1500:
                v = 0
                for i in range(0, 16, 4):
                    if px_ind < len(a):
                        v |= a[px_ind] << i
                        px_ind += 1
                rq_msg += word_to_str(v)
        else:
            # 比较模式
            while px_ind < len(a) and len(rq_msg) < 1500:
                v = 0
                for i in range(8):
                    if px_ind < len(a) and a[px_ind] != c:
                        v |= 128 >> i
                    px_ind += 1
                rq_msg += byte_to_str(v)

        # 如果有数据，添加到结果数组
        if len(rq_msg) > 0:
            result.append(rq_msg)

    return result


def prepare_data_strings_b(a, c):
    """
    准备数据并返回字符串数组
    :param a: 像素数组
    :param c: 比较颜色值
    :return: 处理后的字符串数组
    """
    result = []
    px_ind = 0

    # 继续处理直到所有像素都被处理
    while px_ind < len(a):
        rq_msg = ""

        # 每个字符串限制在1500字符以内
        while len(rq_msg) < 1500 and px_ind < len(a):
            x = 0
            while x < 122 and px_ind < len(a):
                v = 0
                # 处理122个像素
                for i in range(8):
                    if i < 8 and x < 122 and px_ind < len(a):
                        # 检查像素是否与比较颜色相同
                        if a[px_ind] != c:
                            # 合并8位像素值
                            v |= 128 >> i
                        px_ind += 1
                        x += 1
                rq_msg += byte_to_str(v)

        # 如果有数据，添加到结果数组
        if len(rq_msg) > 0:
            result.append(rq_msg)

    return result


def get_upload_data(a):
    """
    上传图像到电子墨水屏
    :param a: 像素数组
    :param epd_ind: 电子墨水屏索引
    :return: 处理后的数据数组
    """
    # 根据不同的电子墨水屏型号(epd_ind)设置不同的上传处理流程
    if epd_ind == 3 or epd_ind == 39 or epd_ind == 43:
        return [prepare_data_strings_b(a, 0)]
    if epd_ind == 40:
        return [prepare_data_strings_b(a, 0), prepare_data_strings_b(a, 3)]
    if (
        epd_ind == 0 or
        epd_ind == 3 or
        epd_ind == 6 or
        epd_ind == 7 or
        epd_ind == 9 or
        epd_ind == 12 or
        epd_ind == 16 or
        epd_ind == 19 or
        epd_ind == 22 or
        epd_ind == 26 or
        epd_ind == 27 or
        epd_ind == 28 or
        epd_ind == 39
    ):
        return [prepare_data_strings_a(a, 0)]
    if epd_ind > 15 and epd_ind < 22:
        return [prepare_data_strings_a(a, -1)]
    if epd_ind == 25 or epd_ind == 37:
        return [prepare_data_strings_a(a, -2)]
    if epd_ind == 23:
        return [prepare_data_strings_a(a, 0), prepare_data_strings_a(a, 3)]
    if epd_ind == 1:
        return [prepare_data_strings_a(a, -1), prepare_data_strings_a(a, 3)]
    if epd_ind == 12:
        return [prepare_data_strings_a(a, -1), prepare_data_strings_a(a, 3)]
    else:
        return [prepare_data_strings_a(a, 0), prepare_data_strings_a(a, 3)]